package org.tests;

import java.net.URI;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import net.spy.memcached.CASValue;

import com.couchbase.client.CouchbaseClient;
import com.google.gson.Gson;

class UserData {
	String doctype;
	String username;
	String name;
	String email;
	String password;
	int logins = 0;
}

public class Retrieve {

	public static void main(String[] args) {

		System.out
				.println("--------------------------------------------------------------------------");
		System.out.println("\tCouchbase Retrieve Operations");
		System.out
				.println("--------------------------------------------------------------------------");

		List<URI> uris = new LinkedList<URI>();

		uris.add(URI.create("http://127.0.0.1:8091/pools"));

		CouchbaseClient cb = null;
		try {
			cb = new CouchbaseClient(uris, "default", "");
			Gson json = new Gson();

			// create data
			UserData user1 = new UserData();
			user1.doctype = "learn";
			user1.username = "jsmith";
			user1.name = "John Smith";
			user1.email = "jsmith@email.com";
			user1.password = "p4ssw0rd";
			user1.logins = 0;

			UserData user2 = new UserData();
			user2.doctype = "learn";
			user2.username = "xsmith";
			user2.name = "Xavier Smith";
			user2.email = "xsmith@email.com";
			user2.password = "p4ssw0rd";
			user2.logins = 0;

			// set the doc
			cb.set(user1.email, 0, json.toJson(user1));
			cb.set(user2.email, 0, json.toJson(user2));

			{
				System.out.println("Retrieve the data");
				Object doc = cb.get(user1.email);
				System.out.println(doc);
				System.out.println("");
			}

			{
				System.out
						.println("--------------------------------------------------------------------------");
				System.out.println("Retrieve the data async with CAS");
				UserData testUser = null;
				CASValue casValue = cb.gets(user1.email);
				System.out.println("Value : " + casValue.getValue());
				System.out.println("CAS : " + casValue.getCas());
				testUser = json.fromJson(casValue.getValue().toString(),
						UserData.class);

				System.out
						.println("--------------------------------------------------------------------------");
				System.out.println("Update doc and look at cas");
				testUser.logins += 1;

				cb.replace(testUser.email, 0, json.toJson(testUser));

				CASValue casValue2 = cb.gets(user1.email);
				System.out.println("New Cas Value :" + casValue2.getCas());

				System.out.println("");
			}

			{
				System.out
						.println("--------------------------------------------------------------------------");
				System.out.println("Create 9 Keys and do Multi-Get");

				List<String> keys = new ArrayList<String>();
				for (int i = 1; i < 10; i++) {
					// put a gap in the list to show missing item
					if (i != 3) {
						cb.set("key-" + i, 30,
								"{ \"doctype\" : \"learn\", \"value\" : " + i
										+ "}");
					}
					keys.add("key-" + i);
				}

				Map<String, Object> values = cb.getBulk(keys);
				System.out.println(values);
				System.out.println("");

			}

			System.out.println("\n\n");

			cb.shutdown(10, TimeUnit.SECONDS);

		} catch (Exception e) {
			System.err.println("Error connecting to Couchbase: "
					+ e.getMessage());
		}
	}

}
